home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / opndor / ex_vote.c < prev    next >
C/C++ Source or Header  |  1996-02-26  |  47KB  |  1,297 lines

  1. /* EX_VOTE.C - This program demonstrates an online voting program that is    */
  2. /*             written using OpenDoors. The Vote program allows users to     */
  3. /*             create questions or surveys for other users to respond to.    */
  4. /*             Users are also able to view the results of voting on each     */
  5. /*             topic. The program supports up to 200 questions, and can be   */
  6. /*             configured to either allow or disallow viewing of results     */
  7. /*             prior to voting.                                              */
  8. /*                                                                           */
  9. /*             This program shows how to do the following:                   */
  10. /*                                                                           */
  11. /*                - How to display text using od_printf(), using imbedded    */
  12. /*                  strings to change the display color.                     */
  13. /*                - Add support for standard command-line options.           */
  14. /*                - Use the OpenDoors configuration file system, including   */
  15. /*                  adding your own configuration file options.              */
  16. /*                - Activate the OpenDoors log file system and write         */
  17. /*                  information to the log file.                             */
  18. /*                - Display a menu from an external ASCI/ANSI/Avatar/RIP     */
  19. /*                  file.                                                    */
  20. /*                - How to setup a user file and general data file, and how  */
  21. /*                  to access it in a multi-node compatible way (if          */
  22. /*                  MULTINODE_AWARE is defined).                             */
  23. /*                                                                           */
  24. /*             To recompile this program, follow the instructions in the     */
  25. /*             OpenDoors manual. For a DOS compiler, be sure to set your     */
  26. /*             compiler to use the large memory model, and add the           */
  27. /*             ODOORL.LIB file to your project/makefile.                     */
  28.  
  29. /* Uncomment the following line for multi-node compatible file access. */
  30. /* #define MULTINODE_AWARE */
  31.  
  32. /* Include standard C header files required by Vote. */
  33. #include <string.h>
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <time.h>
  37. #include <errno.h>
  38. #include <ctype.h>
  39. #ifdef MULTINODE_AWARE
  40. #include <io.h>
  41. #include <fcntl.h>
  42. #include <sys/stat.h>
  43. #include <share.h>
  44. #endif
  45.  
  46. /* Include the OpenDoors header file. This line must be done in any program */
  47. /* using OpenDoors.                                                         */
  48. #include "opendoor.h"
  49.  
  50.  
  51. /* Manifest constants used by Vote */
  52. #define NO_QUESTION              -1
  53. #define NEW_ANSWER               -1
  54.  
  55. #define QUESTIONS_VOTED_ON        0x0001
  56. #define QUESTIONS_NOT_VOTED_ON    0x0002
  57.  
  58. #define MAX_QUESTIONS             200
  59. #define MAX_USERS                 30000
  60. #define MAX_ANSWERS               15
  61. #define QUESTION_STR_SIZE         71
  62. #define ANSWER_STR_SIZE           31
  63.  
  64. #define USER_FILENAME             "VOTE.USR"
  65. #define QUESTION_FILENAME         "VOTE.QST"
  66.  
  67. #define FILE_ACCESS_MAX_WAIT      20
  68.  
  69. #define QUESTION_PAGE_SIZE        17
  70.  
  71.  
  72. /* Structure of records stored in the VOTE.USR file */
  73. typedef struct
  74. {
  75.    char szUserName[36];
  76.    BYTE bVotedOnQuestion[MAX_QUESTIONS];
  77. } tUserRecord;
  78.               
  79. tUserRecord CurrentUserRecord;
  80. int nCurrentUserNumber;
  81.  
  82.  
  83. /* Structure of records stored in the VOTE.QST file */
  84. typedef struct
  85. {
  86.    char szQuestion[72];
  87.    char aszAnswer[MAX_ANSWERS][32];
  88.    INT32 nTotalAnswers;
  89.    DWORD auVotesForAnswer[MAX_ANSWERS];
  90.    DWORD uTotalVotes;
  91.    DWORD bCanAddAnswers;
  92.    char szCreatorName[36];
  93.    time_t lCreationTime;
  94. } tQuestionRecord;
  95.  
  96.  
  97. /* Global variables. */
  98. int nViewResultsFrom = QUESTIONS_VOTED_ON;
  99. int nQuestionsVotedOn = 0;
  100.  
  101.  
  102. /* Prototypes for functions that form EX_VOTE */
  103. void CustomConfigFunction(char *pszKeyword, char *pszOptions);
  104. void BeforeExitFunction(void);
  105. void VoteOnQuestion(void);
  106. void ViewResults(void);
  107. int GetQuestion(int nQuestion, tQuestionRecord *pQuestionRecord);
  108. void AddQuestion(void);
  109. int ChooseQuestion(int nFromWhichQuestions, char *pszTitle, int *nLocation);
  110. void DisplayQuestionResult(tQuestionRecord *pQuestionRecord);
  111. int ReadOrAddCurrentUser(void);
  112. void WriteCurrentUser(void);
  113. FILE *ExclusiveFileOpen(char *pszFileName, char *pszMode, int *phHandle);
  114. void ExclusiveFileClose(FILE *pfFile, int hHandle);
  115. void WaitForEnter(void);
  116.  
  117.  
  118. /* main() or WinMain() function - Program execution begins here. */
  119. #ifdef ODPLAT_WIN32
  120. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  121.    LPSTR lpszCmdLine, int nCmdShow)
  122. #else
  123. int main(int argc, char *argv[])
  124. #endif
  125. {
  126.    /* Variable to store user's choice from the menu */
  127.    char chMenuChoice = '\0';
  128.    char chYesOrNo;
  129.  
  130. #ifdef ODPLAT_WIN32
  131.    /* In Windows, pass in nCmdShow value to OpenDoors. */
  132.    od_control.od_cmd_show = nCmdShow;
  133.  
  134.    /* Ignore unused parameters. */
  135.    (void)hInstance;
  136.    (void)hPrevInstance;
  137. #endif
  138.    
  139.    /* Set program's name for use by OpenDoors. */
  140.    strcpy(od_control.od_prog_name, "Vote");
  141.    strcpy(od_control.od_prog_version, "Version 6.00");
  142.    strcpy(od_control.od_prog_copyright, "Copyright 1991-1996 by Brian Pirie");
  143.  
  144.    /* Call the standard command-line parsing function. You will probably     */
  145.    /* want to do this in most programs that you write using OpenDoors, as it */
  146.    /* automatically provides support for many standard command-line options  */
  147.    /* that will make the use and setup of your program easer. For details,   */
  148.    /* run the vote program with the /help command line option.               */
  149. #ifdef ODPLAT_WIN32
  150.    od_parse_cmd_line(lpszCmdLine);
  151. #else
  152.    od_parse_cmd_line(argc, argv);
  153. #endif
  154.  
  155.    /* Enable use of OpenDoors configuration file system. */
  156.    od_control.od_config_file = INCLUDE_CONFIG_FILE;
  157.  
  158.    /* Set function to process custom configuration file lines. */
  159.    od_control.od_config_function = CustomConfigFunction;
  160.  
  161.    /* Include the OpenDoors multiple personality system, which allows    */
  162.    /* the system operator to set the sysop statusline / function key set */
  163.    /* to mimic the BBS software of their choice.                         */
  164.    od_control.od_mps = INCLUDE_MPS;
  165.    
  166.    /* Include the OpenDoors log file system, which will record when the */
  167.    /* door runs, and major activites that the user performs.            */ 
  168.    od_control.od_logfile = INCLUDE_LOGFILE;
  169.  
  170.    /* Set filename for log file. If not set, DOOR.LOG will be used by */
  171.    /* default.                                                        */
  172.    strcpy(od_control.od_logfile_name, "VOTE.LOG");
  173.  
  174.    /* Set function to be called before program exits. */
  175.    od_control.od_before_exit = BeforeExitFunction;
  176.  
  177.    /* Initialize OpenDoors. This function call is optional, and can be used */
  178.    /* to force OpenDoors to read the door informtion file and begin door    */
  179.    /* operations. If a call to od_init() is not included in your program,   */
  180.    /* OpenDoors initialization will be performed at the time of your first  */
  181.    /* call to any OpenDoors function. */
  182.    od_init();
  183.  
  184.    /* Call the Vote function ReadOrAddCurrentUser() to read the current   */
  185.    /* user's record from the Vote user file, or to add the user to the    */
  186.    /* file if this is the first time that they have used Vote.            */
  187.    if(!ReadOrAddCurrentUser())
  188.    {
  189.       /* If unable to obtain a user record for the current user, then exit */
  190.       /* the door after displaying an error message.                       */
  191.       od_printf("Unable to access user file. File may be locked or full.\n\r");
  192.       WaitForEnter();
  193.       od_exit(1, FALSE);
  194.    }   
  195.  
  196.    /* Loop until the user choses to exit the door. For each iteration of  */
  197.    /* this loop, we display the main menu, get the user's choice from the */
  198.    /* menu, and perform the appropriate action for their choice.